home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
asmlib06.zip
/
ASMLIB06.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-01-04
|
5KB
|
152 lines
INCLUDE EXTENDA.INC
;***********************************************************************
;
; Equates
;
$define FALSE 0000H
$define TRUE 0001H
CODESEG ASMLIB06
DATASEG
CLpublic <CURDIR, CURDRV, HOMEDIR>
; storage for full pathname and pointer to address it
CLstatic <byte ASCIIZ <<64 DUP(0)>>, cptr STRING ASCIIZ>
;******
;
; CURDIR()
;
; string = CURDIR(drive)
;
; drive: drive letter (A, B, ...)
; : current drive if omitted.
;
CLfunc char CURDIR <char drive>
CLcode
PUSH DS ; preserve
PUSH ES ; preserve
LDS SI, STRING ; point to mem block
MOV BYTE PTR [SI],0 ; null string if error
MOV DL, 0 ; assume default drive
TESTNUL drive ; test if parameter supplied
JZ FILL_ASCIIZ
; parameter supplied..get specified drive letter
PUSH ES ; preserve
LES BX, drive ; load pointer
MOV DL, ES:[BX] ; get drive letter
AND DL, 01011111B ; ensure upper case
SUB DL, ('A' - 1) ; convert to number ('A' = 1)
POP ES ; restore
FILL_ASCIIZ:
PUSH SI
MOV BYTE PTR [SI],'\'
INC SI
DOSREQ 47H ; Get current dir. string from DOS
PUSH DS
PUSH SI
POP DI
POP ES
XOR AX,AX ;
CLD ; Scan direction forwards
MOV CX,0FFH ; Max. bytes to scan
REPNE SCASB ; Find end of string
MOV BYTE PTR [DI],0 ; Mark it
DEC DI ; Move back one
MOV BYTE PTR [DI],'\' ; And insert trailing backslash
POP SI
POP ES ; restore
POP DS ; restore
; return pointer to directory path
CLRET STRING
;****************************************************************************
; CURDRV
; This function checks and returns the DOS current disk drive as
; an ASCIIZ string.
;
; Parameters :
; None
;
; Returns :
; Current drive designation - A:, B:, C:, etc
;
CLFUNC CHAR CURDRV
CLCODE
LDS SI, STRING
DOSREQ 19H ; Get current drive service.
ADD AL,41H ; Convert digit to a letter
MOV DS:[SI+0],AL ; and move it into the buffer.
MOV AL,':' ; Append a colon
MOV DS:[SI+1],AL ; after the drive letter.
MOV AL,0 ; Then null terminate
MOV DS:[SI+2],AL ; the string
CLRET STRING ; and return it to Clipper.
;****************************************************************************
; HOMEDIR
; This function returns the program home directory (the directory
; in which the program is located) as an ASCIIZ string.
;
; Parameters :
; None
;
; Returns :
; the program home directory as an ASCIIZ string.
CLFUNC CHAR HOMEDIR
CLCODE
DOSREQ 62H ; Get PSP segment in BX
PUSH BX ; and move it
POP DS ; into DS.
MOV CX,DS:2CH ; Get environment block segment pointer
PUSH CX ; from DS:2CH into CX and then move it
POP ES ; into ES.
XOR DI,DI ; Start at beginning of block
XOR AX,AX ; and scan for a null (0H).
CLD ; Scan direction forwards.
HOME1:
REPNE SCASB ; Now scan string.
CMP AL,ES:[DI] ; Is byte past end another null?
JNE HOME1 ; No, more strings left, go around.
ADD DI,3 ; Else skip over strings count word.
PUSH ES ; Save string base.
PUSH DI ; Save string offset.
MOV BX,DI ; and copy it to BX.
REPNE SCASB ; Scan string.
MOV AL,'\' ; Now to strip off filename.
STD ; Scan direction is backwards.
REPNE SCASB ; Scan string
CLD ; Scan direction forwards again.
ADD DI,2 ; Adjust DI offset for overshoot.
MOV CX,DI ; Move it into CX, and
SUB CX,BX ; Subtract BX to get string length.
POP SI ; Restore string offset as source offset.
POP DS
MOV AX,DGROUP ; Get DGROUP segment address
MOV ES,AX ; and move it to ES.
LEA DI,ASCIIZ ; Then get buffer offset in DI
REP MOVSB ; and copy string into it.
MOV AL,0 ; Now stick a null terminator
MOV ES:[DI],AL ; onto the end of the string.
LEA DI,ASCIIZ ; Get starting offset again,
SES DI,STRING ; and store pointer to buffer in STRING.
CLRET STRING ; Return it to Clipper
END